package com.toolboxkit.file;

import java.io.*;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;

/**
 * 文件操作工具类
 * 提供文件读写、复制、删除等常用操作
 */
public class FileUtils {
    
    private static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
    
    /**
     * 将文本内容写入文件
     *
     * @param filePath 文件路径
     * @param content  要写入的内容
     * @throws IOException IO异常
     */
    public static void writeToFile(String filePath, String content) throws IOException {
        writeToFile(filePath, content, DEFAULT_CHARSET);
    }
    
    /**
     * 将文本内容写入文件
     *
     * @param filePath 文件路径
     * @param content  要写入的内容
     * @param charset  字符集
     * @throws IOException IO异常
     */
    public static void writeToFile(String filePath, String content, Charset charset) throws IOException {
        Path path = Paths.get(filePath);
        Files.write(path, content.getBytes(charset));
    }
    
    /**
     * 读取文件内容为字符串
     *
     * @param filePath 文件路径
     * @return 文件内容
     * @throws IOException IO异常
     */
    public static String readFromFile(String filePath) throws IOException {
        return readFromFile(filePath, DEFAULT_CHARSET);
    }
    
    /**
     * 读取文件内容为字符串
     *
     * @param filePath 文件路径
     * @param charset  字符集
     * @return 文件内容
     * @throws IOException IO异常
     */
    public static String readFromFile(String filePath, Charset charset) throws IOException {
        Path path = Paths.get(filePath);
        byte[] bytes = Files.readAllBytes(path);
        return new String(bytes, charset);
    }
    
    /**
     * 读取文件内容为行列表
     *
     * @param filePath 文件路径
     * @return 文件内容行列表
     * @throws IOException IO异常
     */
    public static List<String> readLinesFromFile(String filePath) throws IOException {
        return readLinesFromFile(filePath, DEFAULT_CHARSET);
    }
    
    /**
     * 读取文件内容为行列表
     *
     * @param filePath 文件路径
     * @param charset  字符集
     * @return 文件内容行列表
     * @throws IOException IO异常
     */
    public static List<String> readLinesFromFile(String filePath, Charset charset) throws IOException {
        Path path = Paths.get(filePath);
        return Files.readAllLines(path, charset);
    }
    
    /**
     * 复制文件
     *
     * @param sourcePath 源文件路径
     * @param targetPath 目标文件路径
     * @throws IOException IO异常
     */
    public static void copyFile(String sourcePath, String targetPath) throws IOException {
        Path source = Paths.get(sourcePath);
        Path target = Paths.get(targetPath);
        Files.copy(source, target);
    }
    
    /**
     * 删除文件
     *
     * @param filePath 文件路径
     * @throws IOException IO异常
     */
    public static void deleteFile(String filePath) throws IOException {
        Path path = Paths.get(filePath);
        Files.deleteIfExists(path);
    }
    
    /**
     * 检查文件是否存在
     *
     * @param filePath 文件路径
     * @return 文件是否存在
     */
    public static boolean exists(String filePath) {
        Path path = Paths.get(filePath);
        return Files.exists(path);
    }
}